import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
 * Created by L.jp
 * Description:
 * User: 86189
 * Date: 2022-12-21
 * Time: 19:47
 */
//Jedis连接池技术
class JedisPoolUtil {
    //单例模式优化连接池
    private JedisPoolUtil(){};
    private volatile  static JedisPool jedisPool=null;
    private volatile static Jedis jedis=null;
    
    //返回一个连接池
    private static JedisPool getJedisPool(){
        if(jedisPool==null){
            synchronized (JedisPoolUtil.class){
                if(jedisPool==null){
                    // 申请连接时会先看idleObjects队列中是否用过这个连接对象，如果用过就直接从队列中获取连接，
                    // 如果没有就会新建一个对象，新建对象之前会判断当前已经连接的数量是否超过了连接池中的最大连接数量，
                    // 如果没超过就会新建一个对象然后存储到allObjects的哈希表中，然后返回连接对象，
                    // 如果超过了就会进行一个等待时间，阻塞当前的连接，直到有可用的连接为止。
                    JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
                    jedisPoolConfig.setMaxTotal(1000); //连接池最大连接对象的数量
                    jedisPoolConfig.setMaxIdle(100);  //连接池中允许的最大空闲连接数，就是idleObjects队列存储的连接对象数
                    jedisPoolConfig.setMaxWaitMillis(60*1000);
                    // 当资源池连接用尽后，调用者的最大等待时间（单位为毫秒）
                    jedisPoolConfig.setTestOnBorrow(true); //向资源池借用连接时是否做连接有效性检测(业务量很大时候建议设置为false，
                    // 减少一次ping的开销)
                    
                    jedisPool=new JedisPool(jedisPoolConfig,"101.35.154.52",6379);
                }
            }
        }
        return jedisPool;
    }
    
    //得到一个redis实例
    public static Jedis getJedis(){
        if(jedis==null){
            jedis=getJedisPool().getResource();
        }
        return jedis;
    }
}
public class Test_JedisPool {
    public static void main(String[] args) {
        Jedis jedis1 = JedisPoolUtil.getJedis();
        Jedis jedis2 = JedisPoolUtil.getJedis();
        System.out.println(jedis1 == jedis2);
    }
}